# coding=utf-8
"""
功能描述：
把测试用例从数据库中解析出来，形成可以执行的格式，并存放到测试计划中
"""
import openpyxl


# 定义一个用例类，作为数据结构使用
class My_case:
    def __init__(self, tcid, module, describe, prepare, steps, flag):
        self.tcid = tcid
        self.module = module
        self.describe = describe
        self.prepare = prepare
        self.steps = steps
        self.flag = flag


class Dbparser:
    def __init__(self, filename):
        self.filename = filename
        self.sheet = None

    # 获取某一行数据
    def get_one_line(self, row):
        onerow = []
        for j in range(1, self.sheet.max_column + 1):
            onerow.append(self.sheet.cell(row, j).value)
        return onerow

    # 把数据转成测试用例返回，对外提供服务接口
    def get_cases(self, sheetname):
        self.init_sheet(sheetname)
        if self.sheet:
            tcl = []
            # print(self.sheet.max_row)
            for i in range(2, self.sheet.max_row + 1):
                r = self.get_one_line(i)
                # 一行数据就是一个用例，实例化一个My_caes对象，用来保存用例
                case = My_case(tcid=r[0], module=r[1], describe=r[2], prepare=r[3], steps=self.deal_step(r[4]),
                               flag=r[5])
                # print(case)
                tcl.append(case)  # 将用例对象存入列表中，备用
            # print(tcl)
            return tcl
        else:
            print('sheet页没有找到')

    # 获取sheet对象
    def init_sheet(self, sheetname):
        wb = openpyxl.load_workbook(self.filename)
        self.sheet = wb[sheetname]

    # 处理用例步骤，生成列表数据
    def deal_step(self, step_str, sep='||'):
        rlt = []
        step = step_str.splitlines()  # 将步骤字符串按换行符进行拆分，可以得到所有步骤
        for s in step:
            p = {}
            tmp = s.split(sep)  # 将每个步骤中的字符串以sep为分隔符进行拆解
            p['key'] = tmp[0]  # 获取关键字 以字典的形式保存步骤内容，便于在执行时设定定位方式
            for i in range(1, len(tmp)):
                p[tmp[i].split('=', 1)[0]] = tmp[i].split('=', 1)[1]  # 获取后续参数
            rlt.append(p)
        return rlt
